import cv2
import numpy as np
import random

def ShamirSharing(s, k, n):
    """
    实现与 MATLAB 逻辑完全一致的 Shamir 秘密分享算法
    :param s: 原始秘密值
    :param k: 阈值，需要 k 个份额才能恢复秘密
    :param n: 总份额数量
    :return: 份额列表，每个份额是一个 (x, y) 对
    """
    # 生成随机系数 r，长度为 k-1
    r = [round(5 * random.random()) for _ in range(k - 1)]
    r = [1 if x == 0 else x for x in r]  # 确保随机系数不为 0

    # 定义多项式 P(x)
    def P(x):
        return s + sum(r[i] * (x ** (i + 1)) for i in range(k - 1))

    # 生成 n 个份额
    shares = [(i, P(i)) for i in range(1, n + 1)]
    return shares

# 读取灰度图像
image_path = 'watermark_xinxigongcheng1.bmp'  # 替换为你的图像路径
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
    raise FileNotFoundError(f"无法加载图像 {image_path}")

# 获取图像尺寸
h, w = image.shape

# 初始化份额图像（使用8位存储）
fx1 = np.zeros((h, w), dtype=np.uint8)
fx2 = np.zeros((h, w), dtype=np.uint8)
fx3 = np.zeros((h, w), dtype=np.uint8)
fx4 = np.zeros((h, w), dtype=np.uint8)

# 对每个像素进行秘密分享
for i in range(h):
    for j in range(w):
        # 获取当前像素值
        pixel_value = int(image[i, j])

        # 分享当前像素值
        shares = ShamirSharing(pixel_value, 2, 4)

        # 将份额分配到对应的图像
        fx1[i, j] = shares[0][1] % 256
        fx2[i, j] = shares[1][1] % 256
        fx3[i, j] = shares[2][1] % 256
        fx4[i, j] = shares[3][1] % 256

# 保存份额图像
cv2.imwrite('share_1.bmp', fx1)
cv2.imwrite('share_2.bmp', fx2)
cv2.imwrite('share_3.bmp', fx3)
cv2.imwrite('share_4.bmp', fx4)
print("份额图像已保存")